package chat

import (
	"bufio"
	"context"
	"log"

	"github.com/libp2p/go-libp2p/core/host"
	"github.com/libp2p/go-libp2p/core/peer"
	"github.com/libp2p/go-libp2p/core/peerstore"
	"github.com/multiformats/go-multiaddr"
)

// 客户端机器启动
//
//	ctx	流控
//	h	主机
//	dst	目标字符串
func startPeerAndConnect(ctx context.Context, h host.Host, dst string) (*bufio.ReadWriter, error) {
	log.Println("当前节点地址: ")
	for _, la := range h.Addrs() {
		log.Printf(" - %v\n", la)
	}
	log.Println()

	// 将目的地转换为多地址。
	maddr, err := multiaddr.NewMultiaddr(dst)
	if err != nil {
		log.Println(err)
		return nil, err
	}

	// 从多地址提取对等方ID。
	info, err := peer.AddrInfoFromP2pAddr(maddr)
	if err != nil {
		log.Println(err)
		return nil, err
	}

	// 在对等存储中添加目标的对等多地址。这将在libp2p的连接和流创建过程中使用。
	h.Peerstore().AddAddrs(info.ID, info.Addrs, peerstore.PermanentAddrTTL)

	// 使用目的地启动流。使用“peerId”从对等存储中提取目标对等体的多地址。
	s, err := h.NewStream(context.Background(), info.ID, "/chat/1.0.0")
	if err != nil {
		log.Println(err)
		return nil, err
	}
	log.Println("已建立到目的地的连接，本客户端ID：", h.ID())

	// 创建一个缓冲流，这样读写就不会被阻塞。
	rw := bufio.NewReadWriter(bufio.NewReader(s), bufio.NewWriter(s))

	return rw, nil
}
